28 - 4.2 Einleitung: Anhang zur Fallstudie [ID:15253]
50 von 129 angezeigt

Im Rahmen der Fallstudie auf Seite 9 haben wir die N-Kreuz-N-Matrix ja eigentlich als

eindimensionales offenes Feld verstanden. Das sieht man in der Schnittstelle dieser beiden

Funktionen bei Row und bei Collum, die einfach nur ein Zeiger auf einem Speicherbereich repräsentieren.

Und dieser Speicherbereich dann einfach so groß ist, dass er tatsächlich N-Kreuz-N-Integer-Elemente

unserer Matrix dann aufnimmt. Wir wollen hier im Anhang jetzt eine alternative Implementierung

dieser beiden Funktionen vornehmen und zwar indem wir dann die Matrix wirklich als ein

zweidimensionales offenes Feld begreifen. Nun ist es so, dass offene Felder generell als Datentypen

in C nicht bekannt sind, insbesondere eben auch nicht dynamische Felder. Wir müssen die nachbilden.

Wie wir das auf der Seite 10 schon in 9 schon gesehen haben, gilt das hier genauso. Wir müssen

entsprechend das Zeigernkonzept in C verwenden, um denn letztlich hier so offene Felder in der

zweidimensionalen Repräsentation zu repräsentieren. Und für unsere Matrix ist da hilfreich, wenn wir

uns mal ein Entwurfsbild dieser Datenstruktur anschauen, auf die es dann nachher hinauslaufen

wird. Da haben wir mit MX erstmal den Zeiger, den wir übergeben werden an die beiden Prozeduren,

die dann die Initialisierung dieser N-Kreuz-N-Matrix vornehmen sollen. Und hier ist der Zeiger jetzt

nicht einfach direkt ein Zeiger auf den Speicherbereich, wo die einzelnen Feldelemente

denn wirklich liegen werden, sondern hier ist der Zeiger ein Zeiger auf ein Reihenzeigerfeld.

Technisch gesehen ein Zeiger auf einen Zeiger, weil nämlich in diesem Reihenzeigerfeld Zeiger

drin stecken, die dann jeweils auf eine Reihe, auf eine Zeile unserer zweidimensionalen Matrix

verweisen würden. Würden wir jetzt praktisch diesen Zeiger hier auswählen, also die Adresse

einer Zeile auswählen, dann würde es reichen MX von 0, MX von 1 bis MX vom M-1 halt hinzuschreiben.

Wollen wir tatsächlich denn diese Elemente hier auswählen, dann können wir jetzt tatsächlich

zwei Subskriptoperationen hintereinander formulieren, dann wird die Zuweisung,

semantisch zumindest ein bisschen klarer, die man durchführt, um einzelne Elemente

einer Matrix bestimmten Werte zu geben. Hier zum Beispiel das erste Element unserer

zweidimensionalen Matrix würden wir denn halt selektieren mit MX von 0 von 0, das zweite Element

MX 0 und 1 oder hier das letzte Spalten-Element, der ersten Spalte im Endeffekt MX von M-1 von 0.

Also das ist sozusagen das Modell, das wir vor Augen haben, um jetzt eine alternative

Implementierung anzugeben. Die Implementierung basiert natürlich dann darauf, dass man eben

auch diese N-Kreuz-N-Matrix schon irgendwie anders anlegen muss, als man es vorher in einer

Fallstudie gesehen hat. Hier sieht es so aus, erstmal von den Programmargumenten bleibt es

so wie gehabt. Diese Stelle hier, Zeile 8, legt letztendlich das Reihenzeigerfeld an. Also hier

mit C-Allog holen wir uns einen entsprechend großen Speicherbereich N Einträge von Zeigern

auf Integers. Damit bekommen wir einen Zeiger auf den Zeiger zurück. Wenn das gelungen ist,

dann müssen wir jedes einzelne Element in dieser Reihenzeigertabelle initialisieren. Dann müssen

wir dann praktisch die Adresse einer Zeile eintragen und diese Zeilen legen wir dynamisch an mit C-Allog.

Wir wollen hier N Integer-Elemente in dieser Zeile drin haben, N-Kreuz-N-Matrix. Wir sind jetzt in

der I-Zeile, die wir initialisieren wollen. Dann machen wir ein C-Allog, dann kriegen wir einen Zeiger,

auf den Integer-Pointer letztendlich zurück, den tragen wir in MX von ihr ein. Wenn das gelungen

ist, also wenn wir tatsächlich Speicher bekommen haben, dann machen wir weiter. Haben wir keinen

Speicher bekommen, dann werden wir abbrechen. Dann sagen wir einfach, dass dieser Initialisierungsvorgang

gescheitert ist. Wir brechen die Schleife entsprechend ab. Wir würden hier unten jetzt unsere Funktion

bei Row und bei Coil natürlich auch nur dann aufrufen, wenn die Initialisierung unseres

Reihenzeigerfeldes funktioniert hat. Am Ende, wenn die beiden Prozeduren oder eine, die wir ausgewählt

haben, denn durchgelaufen sind, dann geben wir die Ressourcen wieder frei, den Speicherbereich, den

wir angelegt haben. Wir gehen wieder über dieses Reihenzeigerfeld rüber, schauen nach, ob da denn

entsprechend ein Zeiger für eine Zeile definiert ist. Wenn ja, dann geben wir das Element frei. Wenn

nicht, dann brechen wir einfach ab. Weil wir hier oben ja sehen, dass, so wie wir hier ein Null-Element

eingetragen haben, letztendlich, wir wissen, dass danach keine weitere Allokation von Zeilen

durchgeführt worden ist. So können wir hier abbrechen an dieser Stelle. Dann können wir die

Schleife verlassen und geben wir halt noch das Reihenzeigerfeld letztendlich frei. So würde

Teil einer Videoserie :

Zugänglich über

Offener Zugang

Dauer

00:15:05 Min

Aufnahmedatum

2020-05-07

Hochgeladen am

2020-05-07 19:26:07

Sprache

de-DE

Einbetten
Wordpress FAU Plugin
iFrame
Teilen